#coding:utf-8

"""

本代码解决以下问题:
    1. 如亚马孙的robots.txt文件允许抓取网站的产品页面,但是图书的预览页通常不让网络机器人采集
    2. 图书的预览页是通过用户触发ajax脚本进行加载的,预览图片隐藏在div节点下面;事实上,普通的访问者会觉得它们看起来更像是一个flash动画,而不是一个图片文件.当然,即使获取图片,转换成文字也不简单.

解决思路:
    首先导航到托尔斯泰的《战争与和平》的大字号印刷版 1, 打开阅读器,收集图片的url链接,然后下载图片,识别图片,最后打印每个图片的文字
    
    ps: 本代码处理图片效果并不是非常好,如文字出现在彩色封面上时.此时就需要给Tesseract提供大量已知的文字与图片映射集,经过训练Tesseract就可以学会识别同一种字体,这里未做处理!!!
"""


import time
#py3:
from urllib.request import urlretrieve
#py2:
#import urllib
#urllib.urlretrieve()

import subprocess
from selenium import webdriver


#创建新的selenium driver
driver = webdriver.PhantomJS()

#用selenium试试Firefox/Chrome浏览器
#driver = webdriver.Firefox()
#driver = webdriver.Chrome()

driver.get("http://www.amazon.com/War-Peace-Leo-Nikolayevich-Tolstoy/dp/1427030200")

# 单击图书预览按钮 
driver.find_element_by_id("sitbLogoImg").click()

imageList = set()

#等待页面加载完成
time.sleep(10)

#当向右箭头可以点击时,开始翻页
while "pointer" in driver.find_element_by_id("sitbReaderRightPageTurner").get_attribute("style"):
    driver.find_element_by_id("sitbReaderRightPageTurner").click()
    time.sleep(5)
    #获取已加载的新页面(一次可以加载多个页面,但是重复的页面不能加载到集合中),即图书的预览图片地址列表
    pages = driver.find_element_by_xpath("//div[@class='pageImage']/div/img")
    for page in pages:
        image = page.get_attribute("src")
        imageList.add(image)

driver.quit()

#用tesseract处理收集的图片url链接
for image in sorted(imageList):
    """
    urlretrieve 保存图片(不一定是图片,html页面其他的也行)
    urllib.urlretrieve(url[, filename[, reporthook[, data]]]) 
    url: 外部或本地url
    filename: 指定保存到本地的路径(如果未指定该参数,urllib会生成一个临时文件来保存数据)
    reporthook: 回调函数,当连接上服务器,以及相应的数据块传输完毕时会触发该回调,可以利用这个回调函数来显示当前的下载进度
    data: 指post到服务器的数据.
    该方法返回一个包含两个元素的元组(filename, headers) filename表示保存到本地的路径,headers表示服务器的响应头

    下载进度示例:
        def callbackfunc(blocknum, blocksize, totalsize):
            '''回调函数
            @blocknum: 已经下载的数据块
            @blocksize: 数据块的大小
            @totalsize: 远程文件的大小
            '''
            percent = 100.0 * blocknum * blocksize / totalsize
            if percent > 100:
                percent = 100
            print "%.2f%%"% percent
            url = 'http://www.sina.com.cn'
            local = 'sina.html'
            urllib.urlretrieve(url, local, callbackfunc)
    """
    urlretrieve(image, "page.jpg")
    
    """
    subprocess 模块可以用来产生子进程,并连接到子进程的标准输入/输出/错误中去,还可以得到子进程的返回值...   参考 https://www.cnblogs.com/zhoug2020/p/5079407.html
    没具体细看.....
    """
    p = subprocess.Popen(["tesseract", "page.jpg", "page"], stout=subprocess.PIPE, stderr=subprocess.PIPE)
    f = open("page.txt", "r")
    p.wait()  # 当子进程输出了大量数据到stout或stderr的管道,并且达到了系统的缓存大小,子进程会等待父进程读取管道,而父进程此时正在wait,那么这里容易产生死锁!!最好采用subprocess.Popen()方法
    print(f.read())

